package com.qfedu.food.util;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @program: StartCoding
 * @description:
 * @author: Feri(邢朋辉)
 * @create: 2021-01-06 09:24
 */
public class CompressUtil {
    private static final int ARRAY_LEN=2048;
    private static final int READ_FLAG=-1;
    /**
     * 实现目录的压缩
     * @param path 要压缩的目录
     * @param baos 写出的输出流内存流*/
    public static boolean compressZip(String path,ByteArrayOutputStream baos){
        ZipOutputStream zos=null;
        boolean r=false;
        try {
            //实例化输出流对象
            zos=new ZipOutputStream(baos);
            //获取要读取的所有内容 -递归
            File file=new File(path);
            if(file.exists()){
                readContent(file,zos,path);
            }
            r=true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(zos!=null){
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return r;
    }
    /**
     * 实现目录的压缩
     * @param path 要压缩的目录*/
    public static boolean compressZip(String path){
        ZipOutputStream zos=null;
        boolean r=false;
        try {
            //实例化输出流对象
            zos=new ZipOutputStream(new FileOutputStream(path+".zip"));
            //获取要读取的所有内容 -递归
            File file=new File(path);
            if(file.exists()){
                readContent(file,zos,path);
            }
            r=true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(zos!=null){
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return r;
    }
    //循环读取目录的内容并生成压缩文件
    private static void readContent(File file,ZipOutputStream zos,String name) throws IOException {
        if(file.isDirectory()){
            //目录
            File[] arrFiles=file.listFiles();
            for(File f:arrFiles){
                //递归调用  层层深入
                readContent(f,zos,name+"/"+f.getName());
            }
        }else{
            //文件
            //添加当前要压缩的对象
            zos.putNextEntry(new ZipEntry(name));
            //文件内容的读取 IO流
            byte[] data=new byte[ARRAY_LEN];
            int len;
            FileInputStream fis=new FileInputStream(file);
            while ((len=fis.read(data))!=READ_FLAG){
                zos.write(data,0,len);
            }
            //结束当前的压缩对象的写出
            zos.closeEntry();
            fis.close();
        }
    }
}
